package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOUbigeo;
import pe.com.cotelasa.scp.entidad.Pais;
import pe.com.cotelasa.scp.entidad.Ubigeo;

@Repository("daoUbigeo")
public class DAOUbigeoImpl extends DaoImpl<Ubigeo, Integer> implements IDAOUbigeo, Serializable {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Collection<Ubigeo> listarCiudadesPorPais(Pais pais) throws DAOException {
        Collection<Ubigeo> listaCiudades = new ArrayList<Ubigeo>();
        try {
            listaCiudades = sessionFactory.getCurrentSession().createCriteria(Ubigeo.class)
                    .add(Restrictions.eq("idPais", pais)).list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaCiudades;
    }
    
    @Transactional
    public Ubigeo obtenerUbigeoPorNombre(String nombreUbigeo) throws DAOException {
        Ubigeo ubigeoBuscado = null;
        try {
            ubigeoBuscado = (Ubigeo) sessionFactory.getCurrentSession().createCriteria(Ubigeo.class)
                    .add(Restrictions.eq("nombre", nombreUbigeo)).uniqueResult();
        } catch (Exception e) {
            System.err.println(e);
            throw new DAOException(e.getMessage(), e);
            
        }
        return ubigeoBuscado;
    }

    @Override
    public Collection<Ubigeo> listarRegionesPeru(Pais pais) throws DAOException {
        Collection<Ubigeo> listaRegiones = new ArrayList<Ubigeo>();
        try {
            listaRegiones = sessionFactory.getCurrentSession().createCriteria(Ubigeo.class)
                    .add(Restrictions.like("codigo","0000%")).add(Restrictions.eq("idPais", pais)).list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaRegiones;
    }

    @Override
    public Collection<Ubigeo> listarProvincias(String codigo) throws DAOException {
        String codigo1=codigo.substring(4,6);
        Collection<Ubigeo> listaProvincias = new ArrayList<Ubigeo>();
        try {
            listaProvincias = sessionFactory.getCurrentSession().createCriteria(Ubigeo.class)
                    .add(Restrictions.like("codigo","00%"+codigo1)).add(Restrictions.eq("idPais",new Pais(177)))
                    .add(Restrictions.not(Restrictions.like("codigo",codigo))).list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaProvincias;
    }
    
    @Transactional
    public Ubigeo obtenerUbigeoPorCodigo(Ubigeo ubigeo) throws DAOException {
        Ubigeo ubigeoBuscado = null;
        try {
            ubigeoBuscado = (Ubigeo) sessionFactory.getCurrentSession().createCriteria(Ubigeo.class)
                    .add(Restrictions.eq("codigo", ubigeo.getCodigo()))
                    .add(Restrictions.eq("idPais", ubigeo.getIdPais()))
                    .uniqueResult();
            System.out.println(ubigeoBuscado);
        } catch (Exception e) {
            System.err.println(e);
            throw new DAOException(e.getMessage(), e);
            
        }
        return ubigeoBuscado;
    }
}
